package com.javabasic.algorithm.leetcode;

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;

import java.util.stream.Stream;

/**
 * @author mir.xiong
 * @version 1.0
 * @description
 * @see
 * @since Created by work on 2023/12/14 21:34
 */
public class RotateImage {


    public static Stream<int[][]> rotateDate() {
        return Stream.of(new int[][]{
                {1,2,3},
                {4,5,6},
                {7,8,9},
        }, new int[][]{
                {5,1,9,11},
                {2,4,8,10},
                {13,3,6,7},
                {15,14,12,16},
        });
    }

    /**
     * 解题原理：
     * 模拟旋转过程，将整个矩阵分解为多个只有四边的正方形，然后根据旋转过程中每个坐标的变化规律依次旋转；
     * 每次只转四个边上的一个值，循环一条边，最终即可将该四边的正方形旋转到正确位置；
     * 然后再旋转另外一个正方形，当所有的正方形旋转到对应位置之后，即整个矩阵完成玲旋转过程。
     * @param matrix
     */
    @ParameterizedTest
    @MethodSource("rotateDate")
    public void rotate(int[][] matrix) {
        int len = matrix.length;

        int tagLen = len;
        int coordinateX = 0;
        int coordinateY = 0;
        while (tagLen > 1) {

            int temp;
            for (int j = 0; j < len - coordinateY-coordinateX - 1; j++) {
                temp = matrix[coordinateX][coordinateY + j];
                matrix[coordinateX][coordinateY + j] = matrix[len-coordinateX-j-1][coordinateY];
                matrix[len-coordinateX-j-1][coordinateY] = matrix[len-1-coordinateX][len-j-coordinateY-1];
                matrix[len-1-coordinateX][len-j-coordinateY-1] = matrix[coordinateX + j][len-1-coordinateY];
                matrix[coordinateX + j][len-1-coordinateY] = temp;

                for (int row = 0; row < len; row++) {
                    for (int col = 0; col < len; col++) {
                        System.out.print(matrix[row][col] + " ");
                    }
                    System.out.println();
                }
                System.out.println("\n");
            }

            tagLen -= 2;
            coordinateX ++;
            coordinateY ++;
        }
    }
}
